Zanka while in naključna števila


Približek za število π

S pomočjo naključnih števil bomo določili število π

1. podnaloga

Približek za število π lahko določimo tako, da izberemo n naključnih točk v kvadratu [0,1]×[0,1], ter preštejemo, koliko jih leži v krogu s središčem v (0,0) in polmerom 1. Če je n dovolj velik, mora biti razmerje med številom točk v krogu in številom vseh točk približno π/4, saj z veliko točkami "pokrijemo" kvadrat oz. del kroga, ki imata ploščini 1 oziroma π/4.

Sestavi funkcijo približekPi(stTočk), ki izračuna približek za število π po opisani metodi. Število naključnih točk funkcija dobi kot parameter.

Seveda math.pi nima v vaši funkciji kaj početi!

Uradna rešitev

import random
def približekPi(stTočk):
    '''S simulacijo izbire stTočk določi približek za Pi'''
    kolikoVKrogu = 0
    stPoskusa = 1
    while stPoskusa <=  stTočk: # naredimo toliko "poskusov"
        # naključna točka v kvadratu
        x = random.random()
        y = random.random()
        razdalja = x*x + y*y
        if razdalja <= 1 :
            kolikoVKrogu += 1
        stPoskusa = stPoskusa + 1
    # izračunamo razmerje
    razm = kolikoVKrogu / stTočk
    return razm * 4

Mečemo kocko

1. podnaloga

Sestavi funkcijo dvakratZapored(), ki vrne kolikokrat smo vrgli kocko, da smo dvakrat zapored vrgli 6. če npr. mečemo

    2, 6, 3, 4, 6, 4, 5, 6, 6, ...

smo torej kocko morali vreči 9x, da smo dvakrat zapored vrgli 6.

Uradna rešitev

import random
def dvakratZapored():
    '''Kolikometov je potrebnih, da dvakrat zapored vržemo 6'''
    številoMetov = 0
    prejšniMet = 42 # koliko smo vrgli v prejšnem metu (karkoli razen 6!)
    while True : # kar neskončna zanka, izstopili bomo z return
        met = random.randint(1,6)
        številoMetov += 1
        if (met == 6) and (prejšniMet == 6):
            return številoMetov
        prejšniMet = met

2. podnaloga

Sestavi funkcijo verjetnostDveh6(n), ki na podlagi n klicev prejšnje funkcije dvakratZapored() ugotovi, kolikokrat smo v povprečju v n poskusih morali vreči kocko, da smo dvakrat zapored vrgli 6.

Uradna rešitev

import random
def verjetnostDveh6(stPoskusov):
    skupnoŠtMetov = 0
    poskus = 1
    while poskus <= stPoskusov:
        številoMetov = dvakratZapored() # opravimo eno poskus
        skupnoŠtMetov = skupnoŠtMetov + številoMetov
        poskus = poskus + 1
    # verjetnost
    return skupnoŠtMetov / stPoskusov

Enake decimalke

Ogledali si bomo koliko naključnih števil mora računalnik generirati, da dobi tako s samimi enakimi decimalkami

1. podnaloga

Spodnja funkcija vrne vsoto prvih petih decimalk števila x.

Pri tem je predpostavka, da pri računanju abs(x - int(x)) ne pride do zaokrožitvenih napak!!!!! Predelaj jo v funkcijo z imenom enakeDecimalke(x, k) tako, da bo preverila, ali ima realno število x prvih k decimalk enakih.

def vsota(x):
    '''Vsota prvih 5 decimalk števila x'''
    vs = 0
    x = abs(x - int(x))
    i = 1
    while i <= 5:
        x = x * 10
        decim = int(x)
        vs = vs + decim
        x = x - decim
        i = i + 1
    return vs

Opomba: Načeloma se zadeve ne da narediti čisto prav. Če npr. uradno rešitev preizkusimo na

enakeDecimalke(2.2222,4)

dobimo napačen rezultat! Oglej si zakaj, tako da izračunaš x - int(x) tega števila. K nalogi se bomo vrnili kasneje in si pomagali z nizi!

Uradna rešitev

def enakeDecimalke(x, k):
     ''' ali ima število x prvih k decimalk enakih '''
     s = 0
     x = abs(x - int(x)) # decimalni del
     prvaDecimalka = int(x*10)
     i = 1
     while i <= k:
         x = x * 10
         trenutnaDecimalka = int(x)
         if prvaDecimalka != trenutnaDecimalka :
             return False # napačna decimalka!
         x = x - int(x) # še preostale decimalke
         i = i + 1
     return True # vsi testi so bili uspešni

2. podnaloga

Uporabi funkcijo enakeDecimalke v novi funkciji z imenom kolikoGenerirati(k), ki bo preštela, koliko naključnih realnih števil med 0 in 1 moramo generirati, da bomo dobili decimalno število, ki ima prvih k decimalk enakih. Funkcija naj vrne tudi to število - vrne torej par (koliko, nakŠtevilo)!

Uradna rešitev

import random
def kolikoGenerirati(k):
    koliko = 0 # števec generiranih nak. števil
    jeUstrezno = False
    while not jeUstrezno : #Dokler ne bomo naleteli na ustrezno število
        nakŠtevilo = random.random()
        koliko += 1
        if enakeDecimalke(nakŠtevilo, k) : # je število ustrezno?
            jeUstrezno = True #skočimo iz zanke
    return (koliko, nakŠtevilo)